package com.stefanini.pe.bbva.mbl.in.dao;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.stefanini.pe.bbva.mbl.carga.in.to.Configuracionarchivo;
import com.stefanini.pe.bbva.mbl.carga.in.to.ControlCarga;
import com.stefanini.pe.bbva.mbl.carga.in.to.CorporativaKey;
import com.stefanini.pe.bbva.mbl.in.carga.common.Constantes;
import com.stefanini.pe.bbva.mbl.in.dao.iface.ConfiguracionarchivoDAO;

public class ConfiguracionarchivoDAOImpl extends SqlMapClientDaoSupport implements ConfiguracionarchivoDAO {
	
	private static final Logger logger = Logger.getLogger(ConfiguracionarchivoDAOImpl.class);

	public ConfiguracionarchivoDAOImpl() {
		super();
	}

	public int deleteByPrimaryKey(BigDecimal codCargaarchivo) {
		Configuracionarchivo key = new Configuracionarchivo();
		int rows = 0;

		logger.info("Inicio");

		key.setCodCargaarchivo(codCargaarchivo);
		rows = getSqlMapClientTemplate().delete(
				"CARGA_CONFIG_ARCHIVO.ibatorgenerated_deleteByPrimaryKey", key);

		logger.info("Fin");

		return rows;
	}

	public void insert(Configuracionarchivo record) {
		logger.info("Inicio");

		getSqlMapClientTemplate().insert(
				"CARGA_CONFIG_ARCHIVO.ibatorgenerated_insert", record);

		logger.info("Fin");
	}

	public void insertSelective(Configuracionarchivo record) {
		logger.info("Inicio");

		getSqlMapClientTemplate().insert(
				"CARGA_CONFIG_ARCHIVO.ibatorgenerated_insertSelective", record);

		logger.info("Fin");
	}

	public Configuracionarchivo selectByPrimaryKey(BigDecimal codCargaarchivo) {
		Configuracionarchivo key = null;
		Configuracionarchivo record = null;

		logger.info("Inicio");

		key = new Configuracionarchivo();
		key.setCodCargaarchivo(codCargaarchivo);
		record = (Configuracionarchivo) getSqlMapClientTemplate()
				.queryForObject(
						"CARGA_CONFIG_ARCHIVO.ibatorgenerated_selectByPrimaryKey",
						key);

		logger.info("Fin");

		return record;
	}

	public int updateByPrimaryKeySelective(Configuracionarchivo record) {
		int rows = 0;

		logger.info("Inicio");

		rows = getSqlMapClientTemplate()
				.update(
						"CARGA_CONFIG_ARCHIVO.ibatorgenerated_updateByPrimaryKeySelective",
						record);

		logger.info("Fin");

		return rows;
	}

	public int updateByPrimaryKey(Configuracionarchivo record) {
		int rows = 0;

		logger.info("Inicio");

		rows = getSqlMapClientTemplate().update(
				"CARGA_CONFIG_ARCHIVO.ibatorgenerated_updateByPrimaryKey",
				record);

		logger.info("Fin");

		return rows;
	}

	public List selectByCriterio(Configuracionarchivo record) {
		List rows = null;

		logger.info("Inicio");

		rows = getSqlMapClientTemplate()
				.queryForList(
						"CARGA_CONFIG_ARCHIVO.ibatorgenerated_selectByCriteria",
						record);

		logger.info("Fin");

		return rows;
	}

	public List selectAll() {
		List rows = null;

		logger.info("Inicio");

		rows = getSqlMapClientTemplate().queryForList(
				"CARGA_CONFIG_ARCHIVO.ibatorgenerated_selectAll");

		logger.info("Fin");

		return rows;
	}

	public int selectSequence() {
		int secuencia = 0;

		logger.info("Inicio");

		secuencia = Integer.parseInt((String) getSqlMapClientTemplate()
				.queryForObject("CARGA_CONFIG_ARCHIVO.generated_llavePrimaria",
						""));

		logger.info("Fin");

		return secuencia;
	}

	public List selectComboArchivoOrigen() {
		List rows = null;

		logger.info("Inicio");

		rows = getSqlMapClientTemplate()
				.queryForList(
						"CARGA_CONFIG_ARCHIVO.ibatorgenerated_selectArchivoOrigenCombo");

		logger.info("Fin");

		return rows;
	}

	public String insertBackupTablasPG() {
		HashMap map = new HashMap();
		String retorno = null;

		logger.info("Inicio");

		this.getSqlMapClientTemplate().queryForObject(
				"ORIGEN_ARCHIVO.ibatorgenerated_selectBackup", map);
		retorno = (String) map.get("OUT_RETORNO");

		logger.info("Fin");

		return retorno;
	}

	public String insertRestablecerTablasPG() {
		HashMap map = new HashMap();
		String retorno = null;

		logger.info("Inicio");

		this
				.getSqlMapClientTemplate()
				.queryForObject(
						"CARGA_CONFIG_ARCHIVO.ibatorgenerated_selectRestablecerBD",
						map);
		retorno = (String) map.get("OUT_RETORNO");

		logger.info("Fin");

		return retorno;
	}

	public int selectSequenceControlTabla() {
		int secuencia = 0;

		logger.info("Inicio");

		secuencia = Integer
				.parseInt((String) getSqlMapClientTemplate()
						.queryForObject(
								"CARGA_CONFIG_ARCHIVO.generated_llavePrimariaTablaControl",
								""));

		logger.info("Fin");

		return secuencia;
	}

	public int updateEstadoCarga(ControlCarga control) {
		int rows = 0;

		logger.info("Inicio");

		rows = getSqlMapClientTemplate().update(
				"CARGA_CONFIG_ARCHIVO.ibatorgenerated_update", control);

		logger.info("Fin");

		return rows;
	}

	public List selectEstadoCarga() {
		List rows = null;

		logger.info("Inicio");

		rows = getSqlMapClientTemplate()
				.queryForList(
						"CARGA_CONFIG_ARCHIVO.ibatorgenerated_selectTablaControl",
						null);

		logger.info("Fin");

		return rows;
	}

	public String reprocesarCarga() {
		HashMap map = new HashMap();
		String retorno = null;

		logger.info("Inicio");

		this.getSqlMapClientTemplate().queryForObject(
				"CARGA_CONFIG_ARCHIVO.ibatorgenerated_reprocesarCarga", map);
		retorno = (String) map.get("OUT_RETORNO");

		logger.info("Fin");

		return retorno;
	}

	public List consultarEstadoReproceso() {
		HashMap map = new HashMap();
		ArrayList list = new ArrayList();

		this
				.getSqlMapClientTemplate()
				.queryForObject(
						"CARGA_CONFIG_ARCHIVO.ibatorgenerated_consultar_estado_reproceso",
						map);
		list.add((String) map.get("MENSAJE_RETORNO"));
		list.add((String) map.get("VALOR_RETORNO"));

		return list;
	}

	public List consultarCargaArchivos() {
		List list = null;

		list = this.getSqlMapClientTemplate().queryForList(
				"CARGA_CONFIG_ARCHIVO.ibatorgenerated_selectAll_");

		return list;
	}

	public List consultarEstadoRestablecimiento() {
		HashMap map = new HashMap();
		ArrayList list = new ArrayList();

		logger.info("Inicio");

		this
				.getSqlMapClientTemplate()
				.queryForObject(
						"CARGA_CONFIG_ARCHIVO.ibatorgenerated_consultar_estado_reproceso",
						map);
		list.add((String) map.get("MENSAJE_RETORNO"));
		list.add((String) map.get("VALOR_RETORNO"));

		logger.info("Fin");

		return list;
	}

	public List consultarCargaTablas() {
		List list = null;

		list = this.getSqlMapClientTemplate().queryForList(
				"CARGA_CONFIG_ARCHIVO.consultarCargaTablas");

		return list;
	}

	public String reprocesarFileCarga(BigDecimal codCarga) {
		HashMap map = new HashMap();
		String retorno = null;

		logger.info("Inicio");

		map.put("CODIGO_CARGA", codCarga);
		this.getSqlMapClientTemplate().queryForObject(
				"CARGA_CONFIG_ARCHIVO.reprocesarArchivo", map);
		retorno = (String) map.get("RETORNO");

		logger.info("Fin");

		return retorno;
	}

	public HashMap reprocesarFileCarga(List codigos,Date fechaCarga) {
        HashMap map=null;
        boolean estado = true;
        String msgResultado="";

        logger.info("Se realiza la ejecucion del Carga Diaria de Archivos - Reproceso");
        try{
              for (Iterator iter = codigos.iterator(); iter.hasNext();) {
                    BigDecimal codCarga = (BigDecimal) iter.next();
                    Timestamp tFechaCarga= new Timestamp(fechaCarga.getTime());
                    map = new HashMap();
                    map.put("FECHA_CARGA", tFechaCarga);
                    map.put("CODIGO_CARGA", codCarga);
                    logger.info("Se ejecuta el StoreProcedure: "
    						.concat(Constantes.ESQUEMA)
    						.concat(".").concat(Constantes.PACKAGE_CARGA_DIARIA)
    						.concat(".").concat("SP_CARGA_ARCHIVO"));
       
                    this.getSqlMapClientTemplate().queryForObject("CARGA_CONFIG_ARCHIVO.reprocesarArchivo", map);
                    
                    logger.info("Se ejecuto el StoreProcedure: "
    						.concat(Constantes.ESQUEMA)
    						.concat(".").concat(Constantes.PACKAGE_CARGA_DIARIA)
    						.concat(".").concat("SP_CARGA_ARCHIVO => ").concat(codCarga.toString()));
                    
                    if (!(String.valueOf(map.get("RETORNO"))).equals("0")) {
                         estado = false;
                    }
                    msgResultado=String.valueOf(map.get("MENSAJE"));
                    logger.info("Termino de ejecutar el StoreProcedure: "
        					.concat(Constantes.ESQUEMA)
        					.concat(".").concat(Constantes.PACKAGE_CARGA_DIARIA)
        					.concat(".").concat("SP_CARGA_ARCHIVO"));
              }
              logger.info("Termino la ejecucion del Carga Diaria de Archivos - Reproceso");
        }catch(Exception ex){
              logger.error(ex.getMessage(),ex);
        }
        return map;
  }
	
	public HashMap actualizaParamProceso(Date fechaCarga, int inReproceso,int inTimeout,String nomArchivo){
		   HashMap map=null;
		   try{
			   map = new HashMap();
		      Timestamp tFechaCarga= new Timestamp(fechaCarga.getTime());
         
               map.put("FECHA_CARGA", tFechaCarga);
               map.put("IND_REPROCESO", inReproceso);
               map.put("IND_TIMEOUT", inTimeout);
               map.put("NOM_ARCHIVO", nomArchivo);
               logger.info("Se ejecuta el StoreProcedure: "
						.concat(Constantes.ESQUEMA)
						.concat(".").concat(Constantes.PACKAGE_CARGA_DIARIA)
						.concat(".").concat("sp_actualiza_param_proceso"));
			   this.getSqlMapClientTemplate().queryForObject("CARGA_CONFIG_ARCHIVO.actualizarParmProceso", map);
			   logger.info("Termino de ejecutar el StoreProcedure: "
   					.concat(Constantes.ESQUEMA)
   					.concat(".").concat(Constantes.PACKAGE_CARGA_DIARIA)
   					.concat(".").concat("sp_actualiza_param_proceso"));
		   }catch(Exception ex){
			   logger.error(ex.getMessage(),ex);
		   }
		return map;
	}

	/*public boolean reprocesarFileCarga(List codigos) {
		HashMap map;
		boolean estado = true;

		logger.info("Inicio");

		for (Iterator iter = codigos.iterator(); iter.hasNext();) {
			BigDecimal codCarga = (BigDecimal) iter.next();
			map = new HashMap();
			map.put("CODIGO_CARGA", codCarga);
			map.put("FECHA_CARGA", new Timestamp(new Date().getTime()));
			this.getSqlMapClientTemplate().queryForObject(
					"CARGA_CONFIG_ARCHIVO.reprocesarArchivo", map);
			if (!((Integer) map.get("RETORNO")).equals("0")) {
				estado = false;
			}
			
		}

		logger.info("Fin");

		return estado;
	}
	*/
	public HashMap ejecutarCargaInicial() {
		HashMap map = new HashMap();

		logger.info("Inicio");

		this.getSqlMapClientTemplate().queryForObject(
				"CARGA_CONFIG_ARCHIVO.ejecutarCargaInicial", map);

		logger.info("Fin");

		return map;
	}
}